package com.wkm.chainchain.consensusutils;

import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import sun.misc.BASE64Encoder;

import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * RSA工具类, 使用了hutool, 实现RSA加解密, 签名验签即可
 */
public class RSAUtils {

    /**
     * 类型
     */
    public static final String ENCRYPT_TYPE = "RSA";


    /**
     * 公钥加密
     *
     * @param content   要加密的内容
     * @param publicKey 公钥
     */
    public static String encrypt(String content, PublicKey publicKey) {
        try {
            RSA rsa = new RSA(null, publicKey);
            return rsa.encryptBase64(content, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 公钥加密
     *
     * @param content   要加密的内容
     * @param publicKey 公钥
     */
    public static String encrypt(String content, String publicKey) {
        try {
            RSA rsa = new RSA(null, publicKey);
            return rsa.encryptBase64(content, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 私钥解密
     *
     * @param content    要解密的内容
     * @param privateKey 私钥
     */
    public static String decrypt(String content, PrivateKey privateKey) {
        try {
            RSA rsa = new RSA(privateKey, null);
            return rsa.decryptStr(content, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 私钥解密
     *
     * @param content    要解密的内容
     * @param privateKey 私钥
     */
    public static String decrypt(String content, String privateKey) {
        try {
            RSA rsa = new RSA(privateKey, null);
            return rsa.decryptStr(content, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取公私钥-请获取一次后保存公私钥使用
     *
     * @return String[] pairs = {公钥, 私钥}
     */
    public static String[] generateKeyPair() {
        try {
            RSA rsa = new RSA();
            String[] pairs = new String[2];
            // 获取 公钥和私钥 的 编码格式（通过该 编码格式 可以反过来 生成公钥和私钥对象）
            byte[] pubEncBase64 = rsa.getPublicKey().getEncoded();
            byte[] priEncBase64 = rsa.getPrivateKey().getEncoded();

            // 把 公钥和私钥 的 编码格式 转换为 Base64文本 方便保存
            BASE64Encoder base64Encoder = new BASE64Encoder();
            pairs[0] = base64Encoder.encode(pubEncBase64);
            pairs[1] = base64Encoder.encode(priEncBase64);
            return pairs;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 用自己的私钥签名
     */
    public static String sign(String content, String privateKey) {
        return new RSA(privateKey, null).encryptBase64(content, KeyType.PrivateKey);
    }

    /**
     * 用发送该消息的节点的公钥验签
     */
    public static boolean verify(String signed, String content, String publicKey) {
        return content.equals(new RSA(null, publicKey).decryptStr(signed, KeyType.PublicKey));
    }

    public static String getDigest(String str) {
        Digester md5 = new Digester(DigestAlgorithm.MD5);
        return md5.digestHex(str);
    }
}


